/**
 * 
 */
package DAO;

import java.sql.*;
import java.util.ArrayList;

import Model.Cinema;
import Model.Sala;
import utils.ConnectionFactory;

/**
 * @author user
 *
 */
public class DAOSala {
	private Connection conexao;

    public DAOSala() throws DAOExceptionMelhorCinema {
        try {
            this.conexao = ConnectionFactory.getConnection();
        } catch (Exception e) {
            throw new DAOExceptionMelhorCinema("Erro de conexão com o banco: " + ":\n" + e.getMessage());
        }
    }
    
	public void salvar(Sala sala) throws DAOExceptionMelhorCinema {
        PreparedStatement ps = null;
        Connection conexaoL = null;

        if (sala == null) {
            throw new DAOExceptionMelhorCinema("O objeto 'sala' passado não pode ser nulo.");
        }

        try {
            String SQL = "INSERT INTO sala (cnpj, capacidade, tecnologia)"
            	+ "values (?,?,?)";

            conexaoL = this.conexao;
            ps = conexaoL.prepareStatement(SQL);
            ps.setString(1, sala.getCinema().getCnpj());
            ps.setInt(2, sala.getCapacidade());
            ps.setString(3, sala.getTecnologia());
            
            ps.executeUpdate();
        } catch (SQLException sqle) {
            throw new DAOExceptionMelhorCinema("Erro ao inserir uma nova sala: " + sqle);
        } finally {
        	ConnectionFactory.closeConnection(conexaoL, ps);
        }
    }

    public void atualizar(Sala sala) throws DAOExceptionMelhorCinema {
        PreparedStatement ps = null;
        Connection conexaoL = null;

        if (sala == null) {
            throw new DAOExceptionMelhorCinema("O objeto 'sala' passado não pode ser nulo.");
        }

        try {
            String SQL = "UPDATE sala set cnpj=?, capacidade=?, tecnologia=? WHERE cnpj=?";

            conexaoL = this.conexao;
            ps = conexaoL.prepareStatement(SQL);
            
            ps.setString(1, sala.getCinema().getCnpj());
            ps.setInt(2, sala.getCapacidade());
            ps.setString(3, sala.getTecnologia());
            ps.setInt(4, sala.getCodigo());
            
            ps.executeUpdate();
        } catch (SQLException sqle) {
            throw new DAOExceptionMelhorCinema("Erro ao atualizar a sala: " + sqle);
        } finally {
            ConnectionFactory.closeConnection(conexaoL, ps);
        }
    }

    public void excluir(Sala sala) throws DAOExceptionMelhorCinema {
        PreparedStatement ps = null;
        Connection conexaoL = null;

        if (sala == null) {
            throw new DAOExceptionMelhorCinema("O objeto 'sala' passado não pode ser nulo.");
        }

        try {
            String SQL = "DELETE FROM sala WHERE cnpj=?";

            conexaoL = this.conexao;
            ps = conexaoL.prepareStatement(SQL);
            
            ps.setInt(1, sala.getCodigo());
            
            ps.executeUpdate();
        } catch (SQLException sqle) {
            throw new DAOExceptionMelhorCinema("Erro ao excluir a sala: " + sqle);
        } finally {
            ConnectionFactory.closeConnection(conexaoL, ps);
        }
    }

    public ArrayList<Sala> listar() throws DAOExceptionMelhorCinema {
        PreparedStatement ps = null;
        Connection conexaoL = null;
        ResultSet rs = null;

        try {
            String SQL = "SELECT * FROM sala";

            conexaoL = this.conexao;
            ps = conexaoL.prepareStatement(SQL);
            rs = ps.executeQuery();

            ArrayList<Sala> salas = new ArrayList<Sala>();

            while (rs.next()) {
                int			cod_sala		= rs.getInt("cod_sala");
                String		cnpj			= rs.getString("cnpj");
                int			capacidade		= rs.getInt("capacidade");
                String		tecnologia		= rs.getString("tecnologia");
                
                DAOCinema 	daoCinema	= new DAOCinema();
                Cinema		cinema		= daoCinema.procurar(cnpj);                

                salas.add(new Sala(cod_sala, cinema, capacidade, tecnologia));
            }

            return salas;
        } catch (SQLException sqle) {
            throw new DAOExceptionMelhorCinema("Erro ao listar as salas: " + sqle);
        } finally {
            ConnectionFactory.closeConnection(conexaoL, ps);
        }
    }

    public Sala procurar(int codigo) throws DAOExceptionMelhorCinema {
        PreparedStatement ps = null;
        Connection conexaoL = null;
        ResultSet rs = null;

        try {
        	String SQL = "SELECT * FROM sala where cod_sala=?";

            conexaoL = this.conexao;
            ps = conexaoL.prepareStatement(SQL);
            ps.setInt(1, codigo);
            rs = ps.executeQuery();

            if (!rs.next()) {
                throw new DAOExceptionMelhorCinema("Não foi encontrado nenhuma sala com o código: " + codigo);
            }

            int			cod_sala		= rs.getInt("cod_sala");
            String		cnpj			= rs.getString("cnpj");
            int			capacidade 		= rs.getInt("capacidade");
            String		tecnologia		= rs.getString("tecnologia");
            
            DAOCinema	daoCinema		= new DAOCinema();
            Cinema		cinema		= daoCinema.procurar(cnpj);
            
            return new Sala(cod_sala, cinema, capacidade, tecnologia);
        } catch (SQLException sqle) {
            throw new DAOExceptionMelhorCinema("Erro ao buscar a sala: " + sqle);
        } finally {
            ConnectionFactory.closeConnection(conexaoL, ps);
        }
    }
}
